package com.example.demo.Service;

import org.springframework.stereotype.Service;


import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Service
public class MathCaptchaService {

    private final Map<String, Integer> captchaStore = new ConcurrentHashMap<>();
    private final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1);

    @PostConstruct
    public void init() {
        // 定期清理过期的验证码（例如每分钟一次）
        scheduler.scheduleAtFixedRate(this::cleanupExpiredCaptchas, 1, 1, TimeUnit.MINUTES);
    }

    /**
     * 清理过期的验证码。
     */
    private void cleanupExpiredCaptchas() {
        long currentTime = System.currentTimeMillis();
        captchaStore.entrySet().removeIf(entry -> (currentTime - entry.getValue()) > 60000); // 假设验证码有效期为60秒
    }

    /**
     * 生成一个简单的数学问题，并返回问题文本及唯一标识符。
     *
     * @return 包含数学问题和唯一标识符的对象。
     */
    public MathCaptchaResponse generateMathProblem() {
        int num1 = (int) (Math.random() * 9) + 1; // 随机数1 (1-9)
        int num2 = (int) (Math.random() * 9) + 1; // 随机数2 (1-9)
        String operation = "+"; // 可以扩展支持其他运算
        String problemText = num1 + " " + operation + " " + num2;
        int answer = num1 + num2; // 计算正确答案

        String captchaId = UUID.randomUUID().toString();
        captchaStore.put(captchaId, answer); // 存储答案和时间戳

        return new MathCaptchaResponse(problemText, captchaId);
    }

    /**
     * 验证用户提供的答案是否正确。
     *
     * @param captchaId 用户收到的问题的唯一标识符。
     * @param userInput 用户输入的答案。
     * @return 如果答案正确，则返回true；否则返回false。
     */
    public boolean validateAnswer(String captchaId, int userInput) {
        Integer storedAnswer = captchaStore.remove(captchaId);
        if (storedAnswer == null || storedAnswer != userInput) {
            return false;
        }
        return true;
    }

    // 内部类用于封装数学问题响应信息
    public static class MathCaptchaResponse {
        private String problemText;
        private String captchaId;

        public MathCaptchaResponse(String problemText, String captchaId) {
            this.problemText = problemText;
            this.captchaId = captchaId;
        }

        public String getProblemText() {
            return problemText;
        }

        public String getCaptchaId() {
            return captchaId;
        }

        @Override
        public String toString() {
            return "MathCaptchaResponse{" +
                    "problemText='" + problemText + '\'' +
                    ", captchaId='" + captchaId + '\'' +
                    '}';
        }
    }
}